package com.kinyx.framework.crawler;

import com.kinyx.framework.annotation.assist.CanNotNull;
import com.kinyx.framework.annotation.assist.CanNull;
import com.kinyx.framework.annotation.assist.ReturnNotNull;
import com.kinyx.framework.bean.StringFormatter;
import com.kinyx.framework.bean.define.ICrawlerInfo;
import com.kinyx.framework.bean.define.MethodParam;
import com.kinyx.framework.log.Log;

import lombok.Getter;
import lombok.Setter;

/**
 * 抓取参数
 */
public class CrawlerParam extends MethodParam {

	private CrawlerParam() { super(null); }
	public CrawlerParam(@CanNull final Log logger) { super(logger); }

	/** 页面抓取信息 */
	@Getter
	@Setter
	private ICrawlerInfo info;

	/**
	 * 新建或重置参数对象
	 * @param cp 原参数对象
	 * @return 原参数对象或新参数对象
	 */
	@ReturnNotNull
	static CrawlerParam of(@CanNull final CrawlerParam cp) {
		// 未传入参数对象，则创建新参数对象。
		if (cp == null) { return of(new CrawlerParam()); }

		// 统一参数初始化
		cp.init();

		// 返回参数对象
		return cp;
	}

	/**
	 * 新建子参数对象
	 * @param info 页面抓取信息
	 * @return 新对象
	 */
	@ReturnNotNull
	CrawlerParam subParam(@CanNotNull final ICrawlerInfo info) {
		// 创建新参数对象
		final CrawlerParam cp = new CrawlerParam();

		// 自定义参数初始化
		cp.info = info;

		// 统一参数初始化
		this.initSubParam(cp);

		// 返回参数对象
		return cp;
	}

	@Override
	protected void contentsImplAfter(final StringFormatter sf) {
		sf//
				.x(" crawl [%s]", () -> { return this.info != null; }, () -> { return this.info.getRequestArgs().getUrlWithParams(); })//
				.x(" to [%s]", () -> { return this.info != null; }, () -> { return this.info.getFilePath(); })//
		;
	}

}
